package com.xinsoft.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xinsoft.entity.dto.MesProcessDTO;
import com.xinsoft.entity.dto.MesProcessDeviceRefDTO;
import com.xinsoft.entity.dto.MesProcessParam;
import com.xinsoft.entity.po.*;
import com.xinsoft.service.*;
import com.xinsoft.mapper.MesProcessMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author lijie
 * @description 针对表【mes_process(工序配置)】的数据库操作Service实现
 * @createDate 2023-07-18 12:31:57
 */
@Service
public class MesProcessServiceImpl extends ServiceImpl<MesProcessMapper, MesProcess>
        implements MesProcessService {

    @Resource
    MesDocumentService documentService;

    @Resource
    MesProcessMapper processMapper;

    @Resource
    MesProcessTestpointRefService refService;

    @Resource
    MesProcessCheckRefService checkRefService;

    @Resource
    MesProcessDeviceRefService deviceRefService;

    @Override
    public void create(MesProcessDTO mesProcessDTO) {
        processMapper.insert(mesProcessDTO);
        if(mesProcessDTO.getDeviceRefDTOList().size() > 0){
            for (int i = 0; i < mesProcessDTO.getDeviceRefDTOList().size(); i++) {
                MesProcessDeviceRef ref = new MesProcessDeviceRef();
                MesProcessDeviceRefDTO dto = mesProcessDTO.getDeviceRefDTOList().get(i);
                BeanUtil.copyProperties(dto,ref);
                ref.setProcessId(mesProcessDTO.getId());
                deviceRefService.save(ref);
                // 解析执测点集合
                if (mesProcessDTO.getDeviceRefDTOList().get(i).getPointList().size() > 0) {
                    this.dealProcessPointList(ref.getId(),mesProcessDTO.getDeviceRefDTOList().get(i).getPointList());
                }
                // 解析检验项集合
                if (mesProcessDTO.getDeviceRefDTOList().get(i).getCheckList().size() > 0) {
                    this.dealProcessCheckList(ref.getId(),mesProcessDTO.getDeviceRefDTOList().get(i).getCheckList());
                }
            }
        }
    }

    @Override
    public void edit(MesProcessDTO mesProcessDTO) {
        processMapper.updateById(mesProcessDTO);
        if(mesProcessDTO.getDeviceRefDTOList().size() > 0){
            List<MesProcessDeviceRef> list = deviceRefService.list(new QueryWrapper<MesProcessDeviceRef>().eq("process_id",mesProcessDTO.getId()));
            for (int i = 0; i < list.size(); i++) {
                // 只要前端传了对象，就当是更新，清楚原来所有的关联设备的检测项与测点集合
                refService.remove(new QueryWrapper<MesProcessTestpointRef>().eq("process_device_id", list.get(i).getId()));
                refService.remove(new QueryWrapper<MesProcessTestpointRef>().eq("process_device_id", list.get(i).getId()));
            }
            for (int i = 0; i < mesProcessDTO.getDeviceRefDTOList().size(); i++) {
                deviceRefService.remove(new QueryWrapper<MesProcessDeviceRef>().eq("process_id",mesProcessDTO.getId())
                        .eq("device_id",mesProcessDTO.getDeviceRefDTOList().get(i).getDeviceId()));
                MesProcessDeviceRef ref = new MesProcessDeviceRef();
                MesProcessDeviceRefDTO dto = mesProcessDTO.getDeviceRefDTOList().get(i);
                BeanUtil.copyProperties(dto,ref);
                ref.setProcessId(mesProcessDTO.getId());
                deviceRefService.save(ref);
                // 解析执测点集合
                if (mesProcessDTO.getDeviceRefDTOList().get(i).getPointList().size() > 0) {
                    this.dealProcessPointList(ref.getId(),mesProcessDTO.getDeviceRefDTOList().get(i).getPointList());
                }
                // 解析检验项集合
                if (mesProcessDTO.getDeviceRefDTOList().get(i).getCheckList().size() > 0) {
                    this.dealProcessCheckList(ref.getId(),mesProcessDTO.getDeviceRefDTOList().get(i).getCheckList());
                }
            }
        }
    }

    @Override
    public Map getInfoById(Integer id) {
        Map<String, Object> map = new HashMap<>();
        // 拿基础数据
        MesProcess mesProcess = processMapper.selectById(id);
        map.put("mesProcess", mesProcess);
        return map;
    }

    @Override
    public Object findPageListByParam(MesProcessParam param) {
        //分页
        Page<MesProcess> page = new Page<MesProcess>(param.getCurrentPage(), param.getPageSize());
        IPage<MesProcess> resultPage = processMapper.findListByParam(page, param);
        //返回值
        return resultPage;
    }

    private void dealProcessCheckList(Integer id, List<MesProcessCheckRef> checkList) {
        for (int i = 0; i < checkList.size(); i++) {
            MesProcessCheckRef ref = new MesProcessCheckRef();
            BeanUtil.copyProperties(checkList.get(i), ref);
            ref.setProcessDeviceId(id);
            checkRefService.save(ref);
        }
    }

    private void dealProcessPointList(Integer id, List<Integer> list) {
        for (int i = 0; i < list.size(); i++) {
            MesProcessTestpointRef ref = new MesProcessTestpointRef();
            ref.setProcessDeviceId(id);
            ref.setTestPointId(list.get(i));
            refService.save(ref);
        }
    }


//    private void saveProcessDocumentlList(MesProcessDTO mesProcessDTO) {
//        if (mesProcessDTO.getSysFileHisList() != null && mesProcessDTO.getSysFileHisList().size() > 0) {
//            List<MesDocument> mesDocumentList = new ArrayList<>();
//            for (int i = 0; i < mesProcessDTO.getSysFileHisList().size(); i++) {
//                MesDocument mesDocument = new MesDocument();
//                mesDocument.setMesId(mesProcessDTO.getId());
//                mesDocument.setDocumentId(mesProcessDTO.getSysFileHisList().get(i).getId());
//                mesDocumentList.add(mesDocument);
//            }
//            documentService.saveBatch(mesDocumentList);
//        }
//    }
}




